package com.binc.testspring.dto.annotation;

import org.springframework.util.Assert;

import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 标准枚举
 * 如果 是为了配合@dictCode使用的话，这里两个属性的键值是固定，必须叫valuehe desc；不要修改，否则会失效；
 */
public enum EContractStatusEnum {
    PASS(1, "审核通过"),
    FAILED(2, "审核否决"),
    UNCHECK(3, "等待审核"),
    DRAFT(4, "草稿"),
    WITHDRAW(5, "已撤回"),
    RECOVER(6, "已回收"),
    FILE(7, "已归档"),
    SIGNED(8, "已签署"),
    CONFIRMING(9, "待客户确认"),
    NOTALLOW(10, "客户否决"),
    CONFIRMED(11, "客户已确认"),
    TERMINATED(12, "已解约");

    private Integer value;
    private String desc;

    EContractStatusEnum(Integer key, String value) {
        this.value = key;
        this.desc = value;
    }

    public String getDesc() {
        return desc;
    }

    public Integer getValue() {
        return value;
    }


    /**
     * 这个是根据key值返回整枚举实例的；
     * 这个可以很好的配合switch语法；
     */
    public static EContractStatusEnum of(Integer value) {
        for (EContractStatusEnum statusEnum : values()) {
            if (statusEnum.getValue().equals(value)) {
                return statusEnum;
            }
        }
        //ruturn null;
        throw new RuntimeException("没有找到对应的枚举");
    }


    public static String value(Integer value) {
        for (EContractStatusEnum item : EContractStatusEnum.values()) {
            if (item.getValue().equals(value)) {
                return item.getDesc();
            }
        }
        return null;
    }


    public static String str() {
        String value = "字段类型限制:";
        value += Arrays.stream(EContractStatusEnum.values()).map(node -> String.format("[%s,%s]", node.getValue(), node.getValue())).collect(Collectors.joining(" "));
        return value;
    }

    /**
     * 这个有个特殊的限定，一定要从1开始，如果从0开始，或者从1之后的任意一个数字都不行；（好像从1之后的数字开始也行哈，有待研究一下）
     */
    public static String getStrings(Integer aa) {
        // Assert.isTrue (Arrays.stream(AdvanceStatusEnum.values()).filter(o -> (o.value & aa) != 0).mapToInt(AdvanceStatusEnum::getValue).sum() >= Objects.requireNonNull(aa), str());  //这个有点过时了，下边那句更好
        Assert.isTrue(Arrays.stream(EContractStatusEnum.values()).mapToInt(EContractStatusEnum::getValue).sum() >= Objects.requireNonNull(aa), str());
        String collect = Arrays.stream(EContractStatusEnum.values()).filter(o -> (o.value & aa) != 0).map(EContractStatusEnum::getDesc).collect(Collectors.joining(","));
        return collect;
    }

    /**
     * 测试getStrings 方法；
     *
     * @param args
     */
    public static void main(String[] args) {
        String strings = EContractStatusEnum.getStrings(63);//这个正常
        System.out.println(strings);
        System.out.println(EContractStatusEnum.getStrings(64));//这个报异常；
    }


}
